package network;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UdpEchoServer {
    //服务器
    private DatagramSocket socket = null;

    public UdpEchoServer(int port) throws SocketException {
        //对于服务器的端口号我们要进行指定一个值
        socket = new DatagramSocket(port);
    }

    public void start() throws IOException {
        //启动服务器
        System.out.println("启动服务器");
        //客户端对服务端要发出请求
        while(true) {
            //每次循环一次，我们都是在处理一次请求
            //对于处理客户端的请求，以下几步：

            // 1、接收请求，并对其进行解析
            //    DatagramPacket是 UDP Socket发送和接收的数据报，这里传入的二进制数组是自定义的长度
            DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);
            socket.receive(requestPacket);//这里是 输出型参数，返回的值在传入的参数中
            String request = new String(requestPacket.getData(),0,requestPacket.getLength());//这里需要使用有效长度

            // 2、根据解析的请求，我们对其进行计算 回应值 (最关键的逻辑)
            //    因为我们这里是一个 回显服务器，所以请求就是 回应值
            String response = process(request);

            // 3、根据计算的回应值，对其客户端进行返回
            //    我们要返回一个数据报，这里要使用 response 这个回应值进行构造，并且我们还要传入
            DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.getBytes().length,
                    requestPacket.getSocketAddress());
            //requestPacket.getSocketAddress() 这个返回的是两个参数组成的，为服务器的 IP，服务器的 端口号
            socket.send(responsePacket);

            // 4、记录日志
            System.out.printf("[%s : %d] req : %s resp : %s\n",requestPacket.getAddress().toString(),
                    requestPacket.getPort(),request,response);
        }
    }

    public String process(String request) {
        return request;
    }

    public static void main(String[] args) throws IOException {
        UdpEchoServer udpEchoServer = new UdpEchoServer(9090);
        udpEchoServer.start();
    }
}
